package com.molichuxing.services.business.service;

import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.business.dto.response.*;
import com.molichuxing.services.property.OrderTypeEnum;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * C端用户订单组合服务
 *
 * @author zoumingyu
 * @date 2019年8月22日
 */
public interface OrderBizService extends RootService {

    /**
     * 根据用户id查询订单信息
     *
     * @param userId 用户id
     * @return
     */
    List<UserOrderBizDto> getOrderByUser(Integer userId);

    /**
     * 根据用户id查询首页是否需要显示订单信息
     *
     * @param userId 用户id
     * @return
     */
    Boolean getHasPageHomeOrderByUser(Integer userId);

    /**
     * 根据用户id查询是否正常订单信息（不查询取消、删除订单）
     *
     * @param userId 用户id
     * @return
     */
    Boolean getHasNormalOrderByUser(Integer userId);

    /**
     * 根据用户id查询正常订单信息（不查询取消、删除订单）
     *
     * @param userId 用户id
     * @return
     */
    List<OrderMemberBizDto> getNormalOrderByUser(Integer userId);


    /**
     * 根据车辆id查询订单信息
     *
     * @param carId 车辆id
     * @return
     */
    List<CarOrderBizDto> getOrderByCar(Integer carId);

    /**
     * 查询订单信息
     *
     * @param carIds 车辆ids
     * @return
     */
    Map<Integer, List<CarOrderBizDto>> getOrderByCar(List<Integer> carIds);

    /**
     * 根据车辆id查询订单信息
     *
     * @param carId    车辆id
     * @param storeIds 门店ids
     * @return
     */
    List<CarOrderBizDto> getOrderByCar(Integer carId, List<Integer> storeIds);

    /**
     * 查询用车中订单信息
     *
     * @param carId  车辆id
     * @param userId 用id
     * @return
     */
    CarOrderBizDto getUseOrderByCar(Integer carId, Integer userId);

    /**
     * 查询用车中订单信息
     *
     * @param carIds 车辆ids
     * @return
     */
    Map<Integer, CarOrderBizDto> getUseOrderByCar(List<Integer> carIds);

    /**
     * 根据订单号获取订单信息
     *
     * @param orderCode 订单号
     * @return
     */
    OrderBizDto getOrder(Long orderCode);

    /**
     * 根据订单号获取订单信息
     *
     * @param orderCodes 订单号
     * @return
     */
    Map<Long, OrderBizDto> getOrder(List<Long> orderCodes);

    /**
     * 根据用户id查询订单号
     *
     * @param userId 用户id
     * @return
     */
    List<Long> getOrderCodeByUser(Integer userId);

    /**
     * 根据用户id查询订单号
     *
     * @param userIds 用户id
     * @return
     */
    List<Long> getOrderCodeByUser(List<Integer> userIds);

    /**
     * 根据用户id查询所有状态为用车中的车辆id
     *
     * @param userId 用户id
     * @return
     */
    List<OrderCarInfoAppDto> getCarIdsByUser(Integer userId, Integer orderStatus);

    /**
     * 统计排序订单商品销量
     *
     * @return
     */
    List<Integer> getStatisticsGoods();

    /**
     * 订单是否能下单验证
     *
     * @param userId      用户id
     * @param guarantorId 担保人id
     * @return
     */
    OrderVerifyBizDto orderVerify(Integer userId, Integer guarantorId);


    /**
     * 订单待处理数量
     *
     * @return
     */
    OrderPendCountDto getOrderPendCountDto();

    /**
     * 续订、加购订单查询最初主订单号（如本身为最初主订单，则返回本身订单号）
     *
     * @param orderCode 订单号
     * @param orderType 订单类型
     * @return
     */
    Long getMasterOrderCode(Long orderCode, OrderTypeEnum orderType);

    /**
     * 根据支付日期查询未提车订单信息
     *
     * @param payDate 支付日期
     * @return
     */
    List<OrderMemberBizDto> getUnDeliveryByPayDate(LocalDate payDate);

    /**
     * 根据订单号获取交车信息
     *
     * @param orderCode
     * @return
     */
    OrderDeliveryBizDto getDelivery(Long orderCode);

    /**
     * 查询每个车型下生效订单（提车、续订支付）数量
     *
     * @return
     */
    Map<Integer, Integer> getEffectiveOrderVehicleStatistics();

    /**
     * 查询每个门店下生效订单（提车、续订生效）数量
     *
     * @return
     */
    Map<Integer, Integer> getEffectiveOrderStoreStatistics();

    /**
     * 查询每个商品下支付订单（支付、续订支付）数量
     *
     * @param orderType 订单类型
     * @return
     */
    List<GoodsSalesStatisticsBizDto> getEffectiveOrderGoodsStatistics(OrderTypeEnum orderType);

    /**
     * 查询用户用车订单
     *
     * @param userId   用户id
     * @param isReturn 是否还车 true：已还车订单，false：未还车订单
     * @return 订单号list
     */
    List<Long> getCarOrderCodeByUser(Integer userId, boolean isReturn);

}
